#include <vector>
#include <list>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <fstream>
#include <set>
#include "tree.h"

using namespace std;

class TreeIterator
{
public:
    TreeIterator(Tree *root) {
	Q.push(root);
    }    

    bool hasNext() {
	return !Q.empty();
    }

    Tree* next() {
	Tree *rtn = Q.front();
	Q.pop();
	if (rtn->left) Q.push(rtn->left);
	if (rtn->right) Q.push(rtn->right);
	return rtn;
    }

private:
    queue<Tree *> Q;
};


int main(int argc, char **argv)
{
    int input[] = {21,7,5,6,3,2,1,4,6,11,35,56};
    int input2[] = {6,23,43,54,12,54,8,10,11,35,56};
    //int input[] = {7};
    Tree *root = NULL, *root2 = NULL;
    int result;

    for (int i = 0; i < sizeof(input)/sizeof(int); i++) {
        TreeInsert(root, input[i]);
    }

    print_ascii_tree(root);

    TreeIterator iter(root);
    while (iter.hasNext()) {
	cout << iter.next()->data << " ";
    }
    cout << endl;
}
